#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main()
{
    FILE *fp = NULL;

    fp = fopen("./testfile.txt","w+");
    if(fp == NULL) {
        perror("创建/打开 失败！");
        exit(-1);
    }
    printf("创建/打开 成功！");

    int fd;
    fd = fileno(fp);
    if(-1 == fd) {
        perror("FILE指针转文件描述符 失败！");
        fclose(fp);
        exit(-1);
    }
    printf("FILE指针转文件描述符 成功！\n");

    int ret;
    ret = write(fd,"文件描述符与FILE指针互转实验",40);
    if(-1 == ret) {
        perror("写入失败！");
        close(fd);
        exit(-1);
    }
    printf("写入成功，写入 %d byte!\n",ret);

    if(0 > fseek(fp,0,SEEK_SET)){
        perror("设置文件偏移量失败：SEEK_SET");
        fclose(fp);
        exit(-1);
    }

    char buff[50]={0};
    ret = fread(buff,1,40,fp);
    if(ret < 50) {
        if(ferror(fp)) {
            printf("读取失败 !\n");
            fclose(fp);
            exit(-1);
        }
    }
    printf("读取成功，读取字符串为：%s\n",buff);
    
    close(fd);
    
    /* 测试结果：文件描述符与FILE指针指向同一个文件
       fileno :FILE指针 --> 文件描述符
       fdopen :文件描述符 --> FILE指针
       文件I/O 标准I/O 同时有效，但要注意缓冲区不同 
       最好避免 文件I/O和标准I/O 同时使用
    */

    return 0;
}